From e7db198ac70cdf9bd376eb5b206bc79cf4ac7649 Mon Sep 17 00:00:00 2001 From: "kaf24@scramble.cl.cam.ac.uk" Date: Mon, 14 Feb 2005 10:39:59 +0000 Subject: [PATCH] bitkeeper revision 1.1200 (42107fffsY27L01xietRjdMzGHiDzw) x86/64 build fixes and simpler debug tracing. Signed-off-by: keir.fraser@cl.cam.ac.uk --- xen/arch/x86/domain.c | 2 +- xen/arch/x86/shadow.c | 2 +- xen/arch/x86/x86_64/domain_build.c | 5 +- xen/common/keyhandler.c | 7 +- xen/drivers/char/console.c | 174 ++++++++++------------------- xen/include/asm-x86/config.h | 14 +-- xen/include/xen/console.h | 22 ---- xen/include/xen/lib.h | 19 +++- xen/include/xen/serial.h | 1 - 9 files changed, 85 insertions(+), 161 deletions(-) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index dd496ee31a..7e9b9bd763 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -658,7 +658,7 @@ static void switch_segments( { n->arch.flags |= TF_kernel_mode; __asm__ __volatile__ ( "swapgs" ); - update_pagetables(ed); + update_pagetables(n); write_ptbase(n); } diff --git a/xen/arch/x86/shadow.c b/xen/arch/x86/shadow.c index d676317843..776c7a5363 100644 --- a/xen/arch/x86/shadow.c +++ b/xen/arch/x86/shadow.c @@ -469,7 +469,6 @@ unsigned long shadow_l2_table( { struct pfn_info *spfn_info; unsigned long spfn; - l2_pgentry_t *spl2e = 0; unsigned long guest_gpfn; guest_gpfn = __mfn_to_gpfn(d, gpfn); @@ -500,6 +499,7 @@ unsigned long shadow_l2_table( } else { + l2_pgentry_t *spl2e; spl2e = (l2_pgentry_t *)map_domain_mem(spfn << PAGE_SHIFT); /* * We could proactively fill in PDEs for pages that are already diff --git a/xen/arch/x86/x86_64/domain_build.c b/xen/arch/x86/x86_64/domain_build.c index 1ae5604a1a..a6001885a1 100644 --- a/xen/arch/x86/x86_64/domain_build.c +++ b/xen/arch/x86/x86_64/domain_build.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -328,8 +329,8 @@ int construct_dom0(struct domain *d, d->shared_info->vcpu_data[i].evtchn_upcall_mask = 1; d->shared_info->n_vcpu = smp_num_cpus; - /* setup shadow and monitor tables */ - update_pagetable(ed); + /* Set up shadow and monitor tables. */ + update_pagetables(ed); /* Install the new page tables. */ __cli(); diff --git a/xen/common/keyhandler.c b/xen/common/keyhandler.c index 14859a0a91..5ab94600e7 100644 --- a/xen/common/keyhandler.c +++ b/xen/common/keyhandler.c @@ -75,14 +75,12 @@ void register_irq_keyhandler( static void show_handlers(unsigned char key) { int i; - int buffer_enable = sercon_buffer_bypass(); printk("'%c' pressed -> showing installed handlers\n", key); for ( i = 0; i < KEY_MAX; i++ ) if ( key_table[i].u.handler != NULL ) printk(" key '%c' (ascii '%02x') => %s\n", (i<33 || i>126)?(' '):(i),i, key_table[i].desc); - sercon_buffer_set(buffer_enable); } static void dump_registers(unsigned char key, struct xen_regs *regs) @@ -179,10 +177,6 @@ void initialize_keytable(void) #ifndef NDEBUG register_keyhandler( 'o', audit_domains_key, "audit domains >0 EXPERIMENTAL"); - - register_keyhandler( - 'c', sercon_buffer_toggle, - "toggle serial console output vs ring buffer capture"); #endif #ifdef PERF_COUNTERS @@ -191,5 +185,6 @@ void initialize_keytable(void) register_keyhandler( 'P', perfc_reset, "reset performance counters"); #endif + register_irq_keyhandler('%', do_debug_key, "Trap to xendbg"); } diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c index 366b43bb8c..00f2223f77 100644 --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c @@ -51,18 +51,6 @@ static int vgacon_enabled = 0; spinlock_t console_lock = SPIN_LOCK_UNLOCKED; -#ifndef NDEBUG -static unsigned char *sercon_buffer = NULL; -static unsigned char *sercon_buffer_end = NULL; -static unsigned char *sercon_buffer_head = NULL; -static unsigned char *sercon_buffer_next = NULL; - -static unsigned int opt_sercon_buffer_size = 128; /* kbytes */ -integer_param("conbuf", opt_sercon_buffer_size); - -static void sercon_buffer_puts(const unsigned char *s); -#endif - /* * ******************************************************* * *************** OUTPUT TO VGA CONSOLE ***************** @@ -266,11 +254,9 @@ static void switch_serial_input(void) xen_rx = !xen_rx; if ( SWITCH_CODE != 0 ) { - int buffer_enable = sercon_buffer_bypass(); printk("*** Serial input -> %s " "(type 'CTRL-%c' three times to switch input to %s).\n", input_str[xen_rx], opt_conswitch[0], input_str[!xen_rx]); - sercon_buffer_set(buffer_enable); } } @@ -369,12 +355,7 @@ static inline void __putstr(const char *str) { int c; -#ifndef NDEBUG - if ( sercon_handle & SERHND_BUFFERED ) - sercon_buffer_puts(str); - else -#endif - serial_puts(sercon_handle, str); + serial_puts(sercon_handle, str); while ( (c = *str++) != '\0' ) { @@ -485,133 +466,99 @@ void console_force_lock(void) spin_lock(&console_lock); } -// 09Feb2005: this appears to be unused... -void console_putc(char c) -{ - serial_putc(sercon_handle, c); -} - -// 09Feb2005: this appears to be unused... -int console_getc(void) -{ - return serial_getc(sercon_handle); -} - -// 09Feb2005: this appears to be unused... -int irq_console_getc(void) -{ - return irq_serial_getc(sercon_handle); -} /* * ************************************************************** - * *************** serial console ring buffer ******************* + * *************** Serial console ring buffer ******************* * ************************************************************** */ #ifndef NDEBUG -static void sercon_buffer_putc(const unsigned char c) -{ - if ( !sercon_buffer ) - return; - if ( !c ) - return; - if ( sercon_buffer_next == sercon_buffer_end ) - { - // buffer wrap-around case... - sercon_buffer_head = sercon_buffer + 1; - sercon_buffer_next = sercon_buffer; - } - if ( sercon_buffer_head == sercon_buffer_next + 1 ) - { - // the buffer is already full... - sercon_buffer_head++; - } - *sercon_buffer_next++ = c; - *sercon_buffer_next = 0; -} +static unsigned char *debugtrace_buf; /* Debug-trace buffer */ +static unsigned int debugtrace_prd; /* Producer index */ +static unsigned int debugtrace_kilobytes = 128, debugtrace_bytes; +integer_param("debugtrace", debugtrace_kilobytes); +#define DEBUGTRACE_MASK(_p) ((_p) & (debugtrace_bytes-1)) -static void sercon_buffer_puts(const unsigned char *s) +void debugtrace_reset(void) { - // inefficient but simple... - while ( *s ) - sercon_buffer_putc(*s++); + if ( debugtrace_bytes != 0 ) + memset(debugtrace_buf, '\0', debugtrace_bytes); } -static void sercon_buffer_reset(void) +void debugtrace_dump(void) { - sercon_buffer_head = sercon_buffer; - sercon_buffer_next = sercon_buffer; - sercon_buffer_head[0] = 0; -} + int _watchdog_on = watchdog_on; -static void sercon_buffer_flush(void) -{ - serial_puts(sercon_handle, sercon_buffer_head); - if ( sercon_buffer_head != sercon_buffer ) - serial_puts(sercon_handle, sercon_buffer); - sercon_buffer_reset(); -} + if ( debugtrace_bytes == 0 ) + return; -void _sercon_buffer_dump(void) -{ - sercon_buffer_flush(); - sercon_handle &= ~SERHND_BUFFERED; + /* Watchdog can trigger if we print a really large buffer. */ + watchdog_on = 0; + + /* Print oldest portion of the ring. */ + serial_puts(sercon_handle, + &debugtrace_buf[DEBUGTRACE_MASK(debugtrace_prd)]); + + /* Print youngest portion of the ring. */ + debugtrace_buf[DEBUGTRACE_MASK(debugtrace_prd)] = '\0'; + serial_puts(sercon_handle, + &debugtrace_buf[0]); + + debugtrace_reset(); + + watchdog_on = _watchdog_on; } -void sercon_buffer_toggle(unsigned char key) +void debugtrace_printk(const char *fmt, ...) { - if ( !sercon_buffer ) - { - printk("serial console buffer not allocated\n"); + static spinlock_t _lock = SPIN_LOCK_UNLOCKED; + static char buf[1024]; + + va_list args; + unsigned char *p; + unsigned long flags; + + if ( debugtrace_bytes == 0 ) return; - } - if ( sercon_handle & SERHND_BUFFERED ) - sercon_buffer_flush(); - sercon_handle ^= SERHND_BUFFERED; -} + spin_lock_irqsave(&_lock, flags); -void _sercon_buffer_set(int enable) -{ - if (enable) - sercon_handle |= SERHND_BUFFERED; - else - sercon_handle &= ~SERHND_BUFFERED; -} + va_start(args, fmt); + (void)vsnprintf(buf, sizeof(buf), fmt, args); + va_end(args); -int _sercon_buffer_bypass(void) -{ - int buffering = !!(sercon_handle & SERHND_BUFFERED); - sercon_handle &= ~SERHND_BUFFERED; + for ( p = buf; *p != '\0'; p++ ) + debugtrace_buf[DEBUGTRACE_MASK(debugtrace_prd++)] = *p; - return buffering; + spin_unlock_irqrestore(&_lock, flags); } -static int __init sercon_buffer_init(void) +static int __init debugtrace_init(void) { int order; - int kbytes = opt_sercon_buffer_size; - - if ( !kbytes ) - return 0; + unsigned int kbytes; - order = get_order(kbytes * 1024); - sercon_buffer = (void *)alloc_xenheap_pages(order); - ASSERT( sercon_buffer ); + /* Round size down to next power of two. */ + while ( (kbytes = (debugtrace_kilobytes & (debugtrace_kilobytes-1))) != 0 ) + debugtrace_kilobytes = kbytes; - sercon_buffer_end = sercon_buffer + kbytes*1024 - 1; - *sercon_buffer_end = 0; + debugtrace_bytes = debugtrace_kilobytes << 10; + if ( debugtrace_bytes == 0 ) + return 0; - sercon_buffer_reset(); + order = get_order(debugtrace_bytes); + debugtrace_buf = (unsigned char *)alloc_xenheap_pages(order); + ASSERT(debugtrace_buf != NULL); return 0; } -__initcall(sercon_buffer_init); +__initcall(debugtrace_init); + +#endif /* !NDEBUG */ -#endif /* not NDEBUG */ /* @@ -647,8 +594,7 @@ void panic(const char *fmt, ...) __putstr("Reboot in five seconds...\n"); spin_unlock_irqrestore(&console_lock, flags); - watchdog_on = 0; - sercon_buffer_dump(); + debugtrace_dump(); mdelay(5000); machine_restart(0); diff --git a/xen/include/asm-x86/config.h b/xen/include/asm-x86/config.h index 4bba26a826..787d953691 100644 --- a/xen/include/asm-x86/config.h +++ b/xen/include/asm-x86/config.h @@ -99,19 +99,7 @@ extern void __out_of_line_bug(int line) __attribute__((noreturn)); #define out_of_line_bug() __out_of_line_bug(__LINE__) #endif /* __ASSEMBLY__ */ -#ifndef __ASSEMBLY__ -#ifndef NDEBUG -extern void _sercon_buffer_dump(void); -#define sercon_buffer_dump() _sercon_buffer_dump() -#else -#define sercon_buffer_dump() ((void)0) -#endif -#define BUG() do { \ - printk("BUG at %s:%d\n", __FILE__, __LINE__); \ - watchdog_on = 0; \ - sercon_buffer_dump(); \ -} while (0) -#endif /* __ASSEMBLY__ */ +#define FORCE_CRASH() __asm__ __volatile__ ( "ud2" ) #if defined(__x86_64__) diff --git a/xen/include/xen/console.h b/xen/include/xen/console.h index 7cc653595b..024840c0ad 100644 --- a/xen/include/xen/console.h +++ b/xen/include/xen/console.h @@ -22,26 +22,4 @@ void console_endboot(int disable_vga); void console_force_unlock(void); void console_force_lock(void); -void console_putc(char c); -int console_getc(void); -int irq_console_getc(void); - -#ifdef NDEBUG -#define sercon_buffer_bypass() (0) -#else -#define sercon_buffer_bypass() _sercon_buffer_bypass() -int _sercon_buffer_bypass(void); -#endif - -#ifdef NDEBUG -#define sercon_buffer_set(_enable) ((void)(0 && (_enable))); -#else -#define sercon_buffer_set(_enable) _sercon_buffer_set(_enable) -void _sercon_buffer_set(int enable); -#endif - -#ifndef NDEBUG -void sercon_buffer_toggle(unsigned char key); -#endif - #endif /* __CONSOLE_H__ */ diff --git a/xen/include/xen/lib.h b/xen/include/xen/lib.h index 6ce764b7fc..4b274e1975 100644 --- a/xen/include/xen/lib.h +++ b/xen/include/xen/lib.h @@ -2,11 +2,18 @@ #define __LIB_H__ #include +#include #include #include +#define BUG() do { \ + printk("BUG at %s:%d\n", __FILE__, __LINE__); \ + debugtrace_dump(); \ + FORCE_CRASH(); \ +} while ( 0 ) + #ifndef NDEBUG -#define ASSERT(_p) if ( !(_p) ) { printk("Assertion '%s' failed, line %d, file %s\n", #_p , __LINE__, __FILE__); *(int*)0=0; } +#define ASSERT(_p) if ( !(_p) ) { printk("Assertion '%s' failed, line %d, file %s\n", #_p , __LINE__, __FILE__); BUG(); } #else #define ASSERT(_p) ((void)0) #endif @@ -20,6 +27,16 @@ struct domain; void cmdline_parse(char *cmdline); +#ifndef NDEBUG +extern void debugtrace_reset(void); +extern void debugtrace_dump(void); +extern void debugtrace_printk(const char *fmt, ...); +#else +#define debugtrace_reset() ((void)0) +#define debugtrace_dump() ((void)0) +#define debugtrace_printk(_f, ...) ((void)0) +#endif + #define printk printf void printf(const char *format, ...); void panic(const char *format, ...); diff --git a/xen/include/xen/serial.h b/xen/include/xen/serial.h index 2a33714564..5c40db3e7d 100644 --- a/xen/include/xen/serial.h +++ b/xen/include/xen/serial.h @@ -18,7 +18,6 @@ #define SERHND_HI (1<<1) /* Mux/demux each transferred char by MSB. */ #define SERHND_LO (1<<2) /* Ditto, except that the MSB is cleared. */ #define SERHND_COOKED (1<<3) /* Newline/carriage-return translation? */ -#define SERHND_BUFFERED (1<<4) /* Console serial port ring buffered? */ /* Two-stage initialisation (before/after IRQ-subsystem initialisation). */ void serial_init_stage1(void); -- 2.30.2